<?php

namespace App\Models;

use function foo\func;
use houdunwang\arr\Arr;
use Illuminate\Database\Eloquent\Model;

class Category extends Model
{
    protected $fillable = [
        'title', 'description', 'parent_id'
    ];

    //获取分类的树状结构方法
    function getCategoryTree()
    {
        $categorys = Category::all()->toArray();
        return Arr::tree($categorys, 'title', 'id', 'parent_id');
//        Arr::tree()方法用来生成无限级分类的树状结构
        //        参数                   说明
        //        $data               要处理的栏目数组(必须是数组)
        //        $title                	要处理的字段名称
        //        $fieldPri             	主键 id
        //        $fieldPid             	父 id
    }

    //编辑栏目的时候需要根据传递过来的栏目对象,需要提前对栏目模型树做一些处理,例如编辑栏目调整父栏目的时候不能选自己和比自己level等级低的栏目等等
    function getAllCategory()
    {
        //获取到的$categorys是一个数组
        $categorys = $this->getCategoryTree();
        //当编辑某个分类数据的时候,只能选比自己当前分类级别高的分类
        //需要先获取当前栏目的等级
        //each() 方法迭代集合中的内容并将其传递到回调函数中,但是each()方法执行完成后不会对原来的数组产生任何影响,下例each()执行完成后并不会对$categorys产生任何影响
        collect($categorys)->each(function ($value) {
            if ($value['id'] == $this['id']) {
                $this['_level'] = $value['_level'];
            }
        });
        //一个分类要调整父级栏目不能选 栏目等级>=自己等级的栏目
//        map()函数执行也不会影响原来的$categorys这个数组,除非将返回值重新赋值给$categorys
        $categorys = collect($categorys)->map(function ($value) {
            if ($value['_level'] >= $this['_level']) {
                //如果在下面这句话前面加return的话,就只会返回 1 => "_disabled" 我是要返回整个$value数组
                $value['_disabled'] = 'disabled';
                //这里要返回$value
                return $value;
            } else {
                $value['_disabled'] = '';
                return $value;
            }
        })->toArray();
        //如果循环的分类$v['id']==$this['parent_id']说明这个$v是当前编辑分类的父栏目
        foreach ($categorys as $k => $v) {
            if ($v['id'] == $this['parent_id']) {
                $categorys[$k]['_selected'] = 'selected';
            } else {
                $categorys[$k]['_selected'] = '';
            }
        }
        //将通过上面处理过之后的$categorys分类数组返回
        return $categorys;
    }

    //判断当前栏目是否有子栏目的方法
    function hasChild()
    {
        $categorys = $this->getCategoryTree();
        return Arr::hasChild($categorys, $this['id'], 'parent_id');
//        通过hasChild()方法可以判断传递过来的$this['id']是否有子栏目
        //        参数                          	说明
//        data                      	操作的数组
//        cid                      	要被检查是否有子栏目的栏目主键id在这里是$this['id']
//        fieldPid                  	父 ID 键名
    }

//    获取当前栏目子栏目数据的方法
    function getChildCategory()
    {
        $childCategory = Category::select('id', 'title', 'description')->where('parent_id', $this['id'])->get();
        return $childCategory;
    }

    //获取顶级栏目下面的所有三级栏目方法
    function getThreeCategory()
    {
        //先获取当前顶级栏目下的所有二级栏目数组
        $middle = Category::where('parent_id', $this['id'])->pluck('id')->toArray();
        //然后获取当前栏目中的前5条随机栏目.我这里之所以没有使用随机就是因为随机之后会改变数组的键名
        $threeCategory = Category::whereIn('parent_id', $middle)->limit(5)->pluck('title', 'id')->toArray();
        return $threeCategory;

    }

    //获取栏目下的所有商品信息
    function getCategoryGoods( $value = '')
    {
        //取数据的依据是如果栏目id在goods商品的category_id对应的数组中,那这个goods商品就在相应的栏目下
        if ($value == "price_first") {
            return Goods::select('id', 'price', 'pics', 'title', 'category_id')->orderBy('price')->get()->filter(function ($value) {
                if (in_array($this['id'], $value['category_id'])) {
                    return $value;
                }
            });

        } else {
            return Goods::select('id', 'price', 'pics', 'title', 'category_id')->get()->filter(function ($value) {
                if (in_array($this['id'], $value['category_id'])) {
                    return $value;
                }
            });

        }
    }

    //通过Arr数组插件获取当前栏目的所有父级栏目信息
    function getFatherCategory()
    {

        $data = $this->select('id', 'title', 'parent_id')->get()->toArray();
        return array_reverse(Arr::parentChannel($data, $this['id'], 'id', 'parent_id'));
        //参数                          	说明
        //data                      	操作的数组
        //sid                      	用来作为判断依据的
        //fieldPri                 	唯一键名，如果是表则是表的主键
        //fieldPid                  	父 ID 键名

    }

    //返回6个栏目title为2个字的栏目信息
    public function getTwoWordCategory()
    {
        //先从栏目表中筛选出所有栏目title为2个汉字的栏目信息
        $middle = Category::select('id', 'title')->get()->filter(function ($valute) {
//           将所有栏目title是2个汉字的栏目信息返回
            return mb_strlen($valute['title']) == 2;
        });
        //然后从上面筛选的结果中随机返回6个,如果直接对结果使用toArray()方法的话得到的collection集合是一个二维数组,我想要一个一维数组,可以使用pluck方法
        //pluck 方法可以获取集合中给定键对应的所有值
        return $middle->random(6)->pluck('title', 'id')->toArray();
    }

}
